package cn.suimg.neo4j.service;

import cn.suimg.neo4j.bean.Album;
import cn.suimg.neo4j.bean.Singer;
import cn.suimg.neo4j.bean.Song;
import cn.suimg.neo4j.bean.Tag;
import cn.suimg.neo4j.graph.AlbumGraph;
import cn.suimg.neo4j.graph.NeoGraph;
import cn.suimg.neo4j.graph.SingerGraph;
import cn.suimg.neo4j.graph.SongGraph;
import org.springframework.data.domain.Page;

import java.util.List;
import java.util.Map;

public interface MusicNeoService {

    /**
     * 把歌曲导入图库中
     * @param song
     * @return
     */
    boolean importSong(Song song);

    /**
     * 导入歌手
     * @param singer
     * @return
     */
    boolean importSinger(Singer singer);

    /**
     * 导入演唱关系
     * @param singer
     * @param songList
     */
    void importSingRelationship(Singer singer,List<Song> songList);

    /**
     * 导入专辑
     * @param album
     * @return
     */
    boolean importAlbum(Album album);

    /**
     * 导入发布关系
     * @param singer
     * @param albumList
     */
    void importPublishRelationship(Singer singer,List<Album> albumList);

    /**
     * 导入包含关系
     * @param album
     * @param songList
     */
    void importIncludeRelationship(Album album,List<Song> songList);

    /**
     * 导入标签
     * @param tag
     */
    void importTag(Tag tag);

    /**
     * 导入标签的关系
     * @param tag
     * @param song
     */
    void importAttributeRelationship(Tag tag,Song song);

    /**
     *  模糊搜索歌曲
     * @param singer
     * @param album
     * @param song
     * @param pageNo
     * @param pageSize
     * @param type
     * @return
     */
    Page<NeoGraph> searchSong(String singer, String album, String song, Integer pageNo, Integer pageSize, String type);

    /**
     * 查询歌手的所有专辑
     * @param singerId
     * @param pageNo
     * @param pageSize
     * @return
     */
    Page<AlbumGraph> getSingerAllAlbum(Integer singerId,Integer pageNo,Integer pageSize);

    List<AlbumGraph> getSingerAllAlbum(Integer singerId);

    /**
     * 查询歌手所有的歌曲
     * @param singerId
     * @param pageNo
     * @param pageSize
     * @return
     */
    Page<SongGraph> getSingerAllSong(Integer singerId,Integer pageNo,Integer pageSize);

    /**
     * 查询一共有多少歌手
     * @return
     */
    long getSingerCount();

    /**
     * 查询一共有多少专辑
     * @return
     */
    long getAlbumCount();

    /**
     * 查询一共有多少歌曲
     * @return
     */
    long getSongCount();

    /**
     * 查询歌手发布的专辑数量
     * @param singerId
     * @return
     */
    long getAlbumCountBySingerId(Integer singerId);

    /**
     * 查询所有歌手列表
     * @return
     */
    List<SingerGraph> getAllSinger(Integer pageNo, Integer pageSize);

    /**
     * 查询所有专辑信息
     * @return
     */
    List<AlbumGraph> getAllAlbum(Integer pageNo, Integer pageSize);

    /**
     * 查询所有歌曲信息
     * @return
     */
    List<SongGraph> getAllSong(Integer pageNo, Integer pageSize);

    /**
     * 查询专辑内所有的歌曲
     * @param albumId
     * @param pageNo
     * @param pageSize
     * @return
     */
    Page<SongGraph> getAlbumAllSong(Integer albumId, Integer pageNo, Integer pageSize);

    List<SongGraph> getAlbumAllSong(Integer albumId);

    /**
     * 查询和歌手演唱过的歌手和歌曲
     * @param singerId
     * @return
     */
    Map<SingerGraph,List<SongGraph>> getSingedSingerAndSongBySingerId(Integer singerId);

    /**
     * 查询演唱过这首歌的歌手
     * @param songId
     * @return
     */
    List<SingerGraph> getSingedSingerBySongId(Integer songId);

    /**
     * 查询包含该歌曲的专辑列表
     * @param songId
     * @return
     */
    List<AlbumGraph> getIncludeSongAlbumList(Integer songId);

    /**
     * 通过歌曲ID反查歌手列表
     * @param songId
     * @return
     */
    List<SingerGraph> getSingerListBySongId(Integer songId);


}
